/**
 * 数据库清理脚本
 * 用于安全地清理数据库中的测试数据
 * 
 * 使用方法:
 * npm run db:clean          # 交互式清理
 * npm run db:clean -- -f    # 强制清理(无需确认)
 */

import { PrismaClient } from '@prisma/client';
import { info, warn, error } from '../src/utils/logger';
import readline from 'readline';

// 序列化错误对象
function serializeError(err: unknown): Record<string, unknown> {
  if (err instanceof Error) {
    return {
      name: err.name,
      message: err.message,
      stack: err.stack,
      ...(err as any)
    };
  }
  return { error: String(err) };
}

// 数据表清理顺序(考虑外键约束)
const TABLES = [
  'AuditLog',
  '_EvaluationQuestions',
  'Submission',
  'Question',
  'Evaluation', 
  'User'
];

async function confirmAction(): Promise<boolean> {
  if (!process.argv.includes('-f')) {
    const rl = readline.createInterface({
      input: process.stdin,
      output: process.stdout
    });

    warn('\n⚠️  警告: 即将清空数据库!');
    warn('这将永久删除以下表中的所有数据:');
    TABLES.forEach(table => warn(`- ${table}`));
    
    return new Promise((resolve) => {
      rl.question('\n确定要继续吗? (yes/no): ', (answer) => {
        rl.close();
        resolve(answer.toLowerCase() === 'yes');
      });
    });
  }
  return true;
}

async function main() {
  try {
    // 环境检查
    if (!await confirmAction()) {
      info('操作已取消');
      process.exit(0);
    }

    // 初始化数据库客户端
    const prisma = new PrismaClient({
      log: [
        { level: 'warn', emit: 'event' },
        { level: 'error', emit: 'event' }
      ],
      errorFormat: 'pretty'
    });

    // 监听Prisma事件
    prisma.$on('error', (e) => {
      error('数据库错误:', { error: serializeError(e) });
    });

    prisma.$on('warn', (e) => {
      warn('数据库警告:', { warning: serializeError(e) });
    });

    info('🧹 开始清理数据库...\n');

    // 在事务中执行所有清理操作
    await prisma.$transaction(async (tx) => {
      for (const table of TABLES) {
        try {
          await tx.$executeRawUnsafe(`TRUNCATE TABLE "${table}" CASCADE;`);
          info(`✓ 已清空表: ${table}`);
        } catch (err) {
          error(`清空表 ${table} 时发生错误:`, { error: serializeError(err) });
          throw err;
        }
      }
    });

    info('\n✅ 数据库清理完成!');
    
    await prisma.$disconnect();

  } catch (err) {
    error('\n❌ 数据库清理失败:', { error: serializeError(err) });
    process.exit(1);
  }
}

// 处理进程信号
process.on('SIGINT', () => {
  warn('\n已收到SIGINT信号,正在退出...');
  process.exit(0);
});

process.on('SIGTERM', () => {
  warn('\n已收到SIGTERM信号,正在退出...');
  process.exit(0);
});

// 处理未捕获的错误
process.on('uncaughtException', (err) => {
  error('未捕获的异常:', { error: serializeError(err) });
  process.exit(1);
});

process.on('unhandledRejection', (err) => {
  error('未处理的Promise拒绝:', { error: serializeError(err) });
  process.exit(1);
});

// 执行主函数
if (require.main === module) {
  main();
}
